"""
app_config.py 模块
应用程序全局配置（补充管理后台所需配置及单例获取函数）
"""
from dataclasses import dataclass, field
from pathlib import Path
from dotenv import load_dotenv
import os
from config.embedding_config import EmbeddingConfig
from config.llm_config import LLMConfig
from config.vector_db_config import VectorDBConfig

# 新增：问答功能专属配置类（与其他配置类风格统一）
@dataclass
class QAConfig:
    default_top_k: int = int(os.getenv("DEFAULT_TOP_K", 3))  # 默认检索文档数量
    max_top_k: int = 10  # 最大允许检索数量（前端限制用）
    temperature: float = float(os.getenv("QA_TEMPERATURE", 0.7))  # 回答生成随机性


load_dotenv()

@dataclass
class AppConfig:
    # 原有基础配置（保留）
    project_root: Path = Path(__file__).parent.parent.parent
    knowledge_base_path: str = os.getenv("KNOWLEDGE_BASE_PATH", "./knowledge_base")
    vector_db_path: str = os.getenv("VECTOR_DB_PATH", "./vector_stores/chroma")  # 原向量库路径
    models_path: str = os.getenv("MODELS_PATH", "./models")
    logs_path: str = os.getenv("LOGS_PATH", "./logs")

    # 新增：管理后台所需路径（基于project_root，确保路径统一）
    raw_docs_path: str = os.getenv(
        "RAW_DOCS_PATH",
        str(project_root / "data" / "raw_docs")  # 管理后台上传的原始文件存储路径
    )
    # 修正：将metadata_db_path改为Path类型（支持parent属性）
    metadata_db_path: Path = Path(os.getenv(
        "METADATA_DB_PATH",
        project_root / "data" / "metadata" / "metadata.db"  # 直接使用Path对象，无需str转换
    ))

    # 新增：API服务配置（供前端连接后端）
    api_host: str = os.getenv("API_HOST", "localhost")  # 后端服务IP
    api_port: int = int(os.getenv("API_PORT", 11111))  # 后端服务端口

    # 原有子模块配置（保留）
    embedding_config: EmbeddingConfig = field(default_factory=EmbeddingConfig)
    llm_config: LLMConfig = field(default_factory=LLMConfig)
    vector_db_config: VectorDBConfig = field(default_factory=VectorDBConfig)
    # 新增：问答功能配置（与其他子配置平级，不影响现有结构）
    qa_config: QAConfig = field(default_factory=QAConfig)

    # 原有文本处理配置（保留，管理后台复用）
    chunk_size: int = int(os.getenv("CHUNK_SIZE", 500))
    chunk_overlap: int = int(os.getenv("CHUNK_OVERLAP", 50))
    supported_document_extensions: list = field(
        default_factory=lambda: os.getenv("SUPPORTED_EXTENSIONS", ".pdf,.txt,.docx,.md").split(",")
    )
    collection_name: str = os.getenv("COLLECTION_NAME", "zbs_agent_kb")


# 全局单例配置实例（确保整个应用使用同一套配置）
_app_config_instance = None

def get_app_config() -> AppConfig:
    """
    获取全局唯一的AppConfig实例（单例模式）

    避免重复创建配置对象，确保所有模块使用统一的配置参数
    """
    global _app_config_instance
    if _app_config_instance is None:
        _app_config_instance = AppConfig()
    return _app_config_instance
